package Cani;

import java.util.Stack;

import GUI.MassagePanel;
import GUI.SimulareDesenPanel;

public class CautareInAdancimeLimitata {
	int l;
	U1 u1 = new U1();
	U2 u2 = new U2();
	G1 g1 = new G1();
	G2 g2 = new G2();
	T12 t12 = new T12();
	T21 t21 = new T21();
//sfdfsf
//	dasdas
	Operator op[] = { u1, u2, g1, g2, t12, t21 };
	Stack<Nod> nod_frunza = new Stack<Nod>();
	Stack<Nod> nod_expandate = new Stack<Nod>();
	Stack<Nod> tooate = new Stack<Nod>();

	public CautareInAdancimeLimitata() {
		this.l = 0;
	}

	public CautareInAdancimeLimitata(int l) {
		this.l = l;
	}

	public void rezolvare(Nod n) {
		Nod clona = new Nod(n.getX(), n.getY(), n.getNivel(), n.getExpandabil());
		// afisare(nod_frunza);
		if ((nod_frunza.size() == 1) && (cauta_in_stiva_nod_expandate(nod_frunza.get(0)) == true)) {
			MassagePanel.writeMessagePanel("[ERROR] Nu aveam solutie pe nivelul 6 pentru datele introduse");;
			return;
		} else if (solutie(clona)) {
			return;
		} else {
			if (cauta_in_stiva_nod_expandate(clona) == true) {
				nod_frunza.pop();
				rezolvare(nod_frunza.peek());
			} else if (clona.getExpandabil().equals("neexpandabil")) {
				nod_frunza.pop();
				rezolvare(nod_frunza.peek());
			} else {
				nod_expandate.push(clona);
				nod_frunza.pop();
				for (int i = 5; i >= 0; i--) {
					if (op[i].condition(clona)) {
						clona.setNivel(n.getNivel() + 1);
						Nod nod_expandat = new Nod(op[i].action(clona).getX(), op[i].action(clona).getY(), op[i].action(clona).getNivel());
						if (nod_expandat.nivel == 6) {
							nod_frunza.push(new Nod(nod_expandat.getX(), nod_expandat.getY(), nod_expandat.getNivel(), "neexpandabil"));
							tooate.push(new Nod(nod_expandat.getX(), nod_expandat.getY(), nod_expandat.getNivel(), "neexpandabil"));
						} else {
							nod_frunza.push(new Nod(nod_expandat.getX(), nod_expandat.getY(), nod_expandat.getNivel(), "expandabil"));
							tooate.push(new Nod(nod_expandat.getX(), nod_expandat.getY(), nod_expandat.getNivel(), "expandabil"));
						}
					}
				}
				rezolvare(nod_frunza.peek());
			}

		}
	}

	public boolean cauta_in_stiva_nod_expandate(Nod n) {
		for (int i = 0; i < nod_expandate.size(); i++)
			if ((nod_expandate.get(i).x == n.x) && (nod_expandate.get(i).y == n.y))
				return true;
		return false;
	}

	public boolean solutie(Nod n) {
		if (n.getY() == 2)
			return true;
		return false;

	}

	// void afisare(Stack<Nod> list){
	// System.out.print("Prelucrare :");
	// for(int i=0;i<list.size();i++)
	// System.out.print(list.elementAt(i)+" niv :"+((Nod)
	// list.elementAt(i)).getNivel());
	// System.out.println();
	// }

	public void Initializare(Nod n) {
		new CautareInAdancimeLimitata(6);
		nod_frunza.push(n);
	}

	public void afisareeee() {
		// TODO Auto-generated method stub
		SimulareDesenPanel.textdesen.append("niv: 0 \n (0 , 0) \n\n");
		for (int n = 0; n <= 6; n++) {
			String putInSimulareDesen = "";
			for (int i = 0; i < tooate.size(); i++) {
				if (n == ((Nod) tooate.elementAt(i)).getNivel()) {
					putInSimulareDesen = putInSimulareDesen + tooate.elementAt(i) + "\t";
				}
			}
			if (putInSimulareDesen.equals("") == false)
				SimulareDesenPanel.textdesen.append("niv: " + n + "\n " + putInSimulareDesen + "\n\n");
			// String finalSol= " , 2 )";
			// HighlightDesen.drawHighlight(finalSol, 0, Color.green);
		}

	}

	public Stack<Nod> getNod_solutie() {
		return tooate;
	}

}
